在這個模型中,物件們預先被初始化並儲存在Pool中,使用端可以跟Pool請求一個特定物件並使用。物件池模式可以減少建立物件造成的效能浪費。通常來說,物件在被建立時就會被放進物件池中,往後的調用的物件都是池中的物件,可以加快速度。
物件池模式中的角色有
package pools
import (
"sync"
)
type Pool struct {
sync.Mutex
Inuse []interface{}
Available []interface{}
New func() interface{}
}
func NewPool(new func() interface{}) *Pool {
return &Pool{New: new}
}
func (p *Pool) Acquire() interface{} {
p.Lock()
var object interface{}
if len(p.Inuse) != 0 {
object = p.Available[0]
// TODO: remove first element of Available
p.Available = append(p.Available[:0], p.Available[1:]...)
// TODO: add one in Inuse
p.Inuse = append(p.Inuse, object)
} else {
object = p.New()
p.Inuse = append(p.Inuse, object)
}
p.Unlock()
return object
}
package pools
func (p *Pool) Release(object interface{}) {
p.Lock()
p.Available = append(p.Available, object)
for i, v := range p.Inuse {
if v == object {
// TODO: remove object from Inuse and add it to last element of Inuse
p.Inuse = append(p.Inuse[:i], p.Inuse[i+1:]...)
break
}
}
p.Unlock()
}
package main
import (
"fmt"
pools "object-pool/Pools"
)
func main() {
num := func() interface{} {
return 10.0
}
pool := pools.NewPool(num)
object := pool.Acquire()
fmt.Println(pool.Inuse, "... Pool Inuse")
fmt.Println(pool.Available, "... Pool Available")
pool.Release(object)
fmt.Println(pool.Inuse, "... Pool Inuse")
fmt.Println(pool.Available, "... Pool Available")
}
在程式方面,我們學到了list物件的用法。在這次範例中,我們在 Acquire() 中使用了Append()來做成員刪減list中第一個物件的作業。並在Release() 中展示了如何在刪除特定位置的成員。
在這次的模型中,我們看到了一個新的UML圖示:
這個圖示的名字為:”聚合“,如同上下屬的關係。
舉個例子🌰,一間公司是許多部門組合而成的,那麼他們就是屬於聚合關係,如圖
在此篇文章中,我們理解了物件持模式的運作原理,並將其雛形實作完成。
下一篇章中也是以筆電代工廠為例將此模式中應用至情境。